<?php
namespace Addons\Wechat\Controller;

use Admin\Controller\AddonsController;
use Wechat\Wechat;
use Wechat\WechatAuth;

/**
 * 微信对外控制器
 * Class WechatController
 * @package Addons\Wechat\Controller
 */
class WechatController extends AddonsController
{

    private $wechat; // 微信响应对象
    private $wechatAuth; // 微信认证对象

    private $wechatConfig;  // 微信配置信息

    public function __construct()
    {
        parent::__construct();
        $this->wechatConfig = S('WECHATADDONS_CONF');
        if (empty($wechatConfig)) {
            S('WECHATADDONS_CONF', get_addon_config('Wechat'), 0);
            $this->wechatConfig = S('WECHATADDONS_CONF');
        }
        /* 加载微信SDK */
        try {
            $this->wechatAuth = new WechatAuth($this->wechatConfig['appid'], $this->wechatConfig['appsecret']);
        } catch (\Exception $e) {
            logs('微信认证对象实例化异常!' . $e->getMessage());
            exit;
        }
    }


    public function index()
    {
        try {
            $this->wechat = new Wechat($this->wechatConfig['token']);
        } catch (\Exception $e) {
            logs('微信响应对象实例化异常!');
            return;
        }
        /* 获取请求信息 */
        $data = $this->wechat->request();
        if ($data && is_array($data)) {
            switch ($data['MsgType']) {
                case Wechat::MSG_TYPE_EVENT:   // 事件
                    $response = $this->eventHandle($data['Event']);
                    $content = $response['content'];
                    $type = $response['type'];
                    $this->wechat->response($content, $type);   // 临时策略
                    break;
                case Wechat::MSG_TYPE_TEXT:
                    $content = '您的请求我们已收到, 请耐心等待...';
                    $type = Wechat::MSG_TYPE_TEXT;
                    $this->wechat->response($content, $type);   // 临时策略
                    break;
                default:
                    break;
            }
            /* 响应当前请求(自动回复) */
            //$this->wechat->response($content, $type);
        } else {
            $this->wechat->response('您的请求我们已收到, 请耐心等待...');
        }
    }

    /**
     * 事件处理
     */
    private function eventHandle($eventType)
    {
        $response = array('content', 'type');   // 内容, 类型
        switch ($eventType) {
            case Wechat::MSG_EVENT_SUBSCRIBE:   // 关注事件
                $response['content'] = '加鑫财经, 欢迎您!';
                $response['type'] = Wechat::MSG_TYPE_TEXT;
                break;
            default:
                break;
        }
        return $response;
    }

    /**
     * 获取微信用户信息
     * @return array
     */
    public function getUserInfo()
    {
        $code = I('code');
        if ($code) {
            try {
                $tokenArr = $this->wechatAuth->getAccessToken('code', $code);
                if (@$tokenArr['openid']) {
                    $wechatAuthArr = $this->wechatAuth->getUserInfo($tokenArr['openid']);
                    session('wechatAuthArr', $wechatAuthArr);
                }
            } catch (\Exception $e) {
                logs('获取用户数据异常,' . $e->getMessage());
            }
        }
        return $wechatAuthArr;
    }

    /**
     * 获取微信跳转地址
     * @param bool $isLocation
     * @param null $url
     * @param bool $isU
     * @return null|string
     */
    public function getWechatView($isLocation=true, $url=null, $isU=true){
        $url && $currUrl = $isU ? U($url, null, true, true) : $url;
        empty($url) && $currUrl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        $currUrl = $this->wechatAuth->getRequestCodeURL($currUrl);
        //var_dump($currUrl);
        //die;
        if($isLocation){
            header("Location: ".$currUrl);
            die;
        }
        return $currUrl;
    }



    /**
     * 获取错误信息
     * @param $code
     * @return mixed
     */
    private function getError($code)
    {
        $errcode = array(
            "-1" => "系统繁忙",
            "40001" => "获取access_token时AppSecret错误，或者access_token无效",
            "40002" => "不合法的凭证类型",
            "40003" => "不合法的OpenID",
            "40004" => "不合法的媒体文件类型",
            "40005" => "不合法的文件类型",
            "40006" => "不合法的文件大小",
            "40007" => "不合法的媒体文件id",
            "40008" => "不合法的消息类型",
            "40009" => "不合法的图片文件大小",
            "40010" => "不合法的语音文件大小",
            "40011" => "不合法的视频文件大小",
            "40012" => "不合法的缩略图文件大小",
            "40013" => "不合法的APPID",
            "40014" => "不合法的access_token",
            "40015" => "不合法的菜单类型",
            "40016" => "不合法的按钮个数",
            "40017" => "不合法的按钮个数",
            "40018" => "不合法的按钮名字长度",
            "40019" => "不合法的按钮KEY长度",
            "40020" => "不合法的按钮URL长度",
            "40021" => "不合法的菜单版本号",
            "40022" => "不合法的子菜单级数",
            "40023" => "不合法的子菜单按钮个数",
            "40024" => "不合法的子菜单按钮类型",
            "40025" => "不合法的子菜单按钮名字长度",
            "40026" => "不合法的子菜单按钮KEY长度",
            "40027" => "不合法的子菜单按钮URL长度",
            "40028" => "不合法的自定义菜单使用用户",
            "40029" => "不合法的oauth_code",
            "40030" => "不合法的refresh_token",
            "40031" => "不合法的openid列表",
            "40032" => "不合法的openid列表长度",
            "40033" => "不合法的请求字符，不能包含\uxxxx格式的字符",
            "40035" => "不合法的参数",
            "40038" => "不合法的请求格式",
            "40039" => "不合法的URL长度",
            "40050" => "不合法的分组id",
            "40051" => "分组名字不合法",
            "41001" => "缺少access_token参数",
            "41002" => "缺少appid参数",
            "41003" => "缺少refresh_token参数",
            "41004" => "缺少secret参数",
            "41005" => "缺少多媒体文件数据",
            "41006" => "缺少media_id参数",
            "41007" => "缺少子菜单数据",
            "41008" => "缺少oauth code",
            "41009" => "缺少openid",
            "42001" => "access_token超时",
            "42002" => "refresh_token超时",
            "42003" => "oauth_code超时",
            "43001" => "需要GET请求",
            "43002" => "需要POST请求",
            "43003" => "需要HTTPS请求",
            "43004" => "需要接收者关注",
            "43005" => "需要好友关系",
            "44001" => "多媒体文件为空",
            "44002" => "POST的数据包为空",
            "44003" => "图文消息内容为空",
            "44004" => "文本消息内容为空",
            "45001" => "多媒体文件大小超过限制",
            "45002" => "消息内容超过限制",
            "45003" => "标题字段超过限制",
            "45004" => "描述字段超过限制",
            "45005" => "链接字段超过限制",
            "45006" => "图片链接字段超过限制",
            "45007" => "语音播放时间超过限制",
            "45008" => "图文消息超过限制",
            "45009" => "接口调用超过限制",
            "45010" => "创建菜单个数超过限制",
            "45015" => "回复时间超过限制",
            "45016" => "系统分组，不允许修改",
            "45017" => "分组名字过长",
            "45018" => "分组数量超过上限",
            "46001" => "不存在媒体数据",
            "46002" => "不存在的菜单版本",
            "46003" => "不存在的菜单数据",
            "46004" => "不存在的用户",
            "47001" => "解析JSON/XML内容错误",
            "48001" => "api功能未授权",
            "50001" => "用户未授权该api",
        );
        return $errcode[$code];
    }
}